Le modifiche ai dati raramente arrivano da sole: un bonifico deve addebitare un conto e accreditare l'altro, e un ordine deve riservare scorte e registrare un pagamento. Se il sistema si interrompe a metà, il database finisce per descrivere un mondo che non è mai esistito. Una transazione è la risposta del database a questo problema — una sequenza di una o più operazioni che il database tratta come una singola e indivisibile unità di lavoro.
Tutto o niente
All'interno di una transazione, ogni operazione appartiene a un unico esito. Il database non espone mai uno stato finale in cui è avvenuta solo una parte della transazione. L'esempio classico è un bonifico tra due conti bancari: ridurre il saldo del conto di origine, poi aumentare il saldo del conto di destinazione. Se riuscisse solo il primo passo, il denaro svanirebbe; se riuscisse solo il secondo, il denaro comparirebbe dal nulla. Racchiudere entrambi i passi in una sola transazione elimina entrambe le possibilità.
Questa garanzia tutto-o-niente si chiama atomicità. Commit è l'atto che rende permanenti le modifiche della transazione; una transazione che non viene mai confermata non lascia alcuna traccia. Durabilità aggiunge il tassello finale: una volta che il commit è andato a buon fine, la modifica sopravvive anche se la macchina perde alimentazione un attimo dopo.
Una transazione è un confine
È utile immaginare una transazione come un confine tracciato attorno a un gruppo di istruzioni. Prima del confine e dopo di esso, i dati soddisfano le regole imposte dalla struttura. All'interno del confine esistono stati intermedi — un conto è già stato addebitato mentre l'altro non è ancora stato accreditato — ma questi stati sono privati della transazione. Le istruzioni successive in altre sessioni non li considerano come verità.
Due compiti insieme
Le transazioni svolgono quindi due compiti. Il primo è la gestione dei guasti: se il processo va in crash, la connessione cade o un'istruzione genera un errore, il database può ripristinare lo stato esistente prima dell'inizio della transazione. Il secondo è il controllo della visibilità: mentre il lavoro è in corso, gli altri lettori sono protetti dal risultato incompleto. Questi due compiti sono correlati ma non identici — l'atomicità decide se le modifiche vengono mantenute, mentre la visibilità è regolata dall'isolamento, l'impostazione che controlla quanto le transazioni concorrenti possono vedere l'una dell'altra.
